﻿// 344. 奶牛展览 Cow Exhibition（挑战程序设计竞赛）.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;


/*

https://www.papamelon.com/problem/344

贝西有权选择让哪些奶牛参加展览。
由于负的智商或情商会造成负面效果，所以贝西不希望出展奶牛的智商之和小于零，或情商之和小于零。
满足这两个条件下，她希望出展奶牛的智商与情商之和越大越好，请帮助贝西求出这个最大值。

输入
第一行：单个整数 N，1≤N≤100
第二行到第 N+1 行：第 i+1 行有两个整数：S_i​和 F_i，表示第 i 奶牛的智商和情商，−1000≤Si,Fi≤1000

输出
一个整数：表示情商与智商和的最大值
贝西可以不让任何奶牛参加展览，如果这样做是最好的，输出 0
样例 1
输入
5
-5 7
8 -6
6 -3
2 1
-8 -5
输出
8



5
-339 77
87 504
-678 222
-387 788
-99 662


*/


const int N = 200010;
const int M = 110;
const int newZero = 100000;

int dp[2][N];
int n;
int arr[M][2];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i][0] >> arr[i][1]; 
	}

	memset(dp, -0x3f, sizeof dp);

	for (int i = 0; i < N; i++) {
		dp[0][i] = -999999999;
		dp[1][i] = -999999999;
	}

	dp[0][newZero] = 0;
	int ans = 0;
	int curr = 1; int prev = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < N; j++) {
			dp[curr][j] = dp[prev][j];
			int eq = arr[i][0]; int iq = arr[i][1];

			if(j-eq <N)
				dp[curr][j] = max(dp[curr][j], dp[prev][j - eq] + iq);


			if (i == n && j >= newZero && dp[curr][j] >= 0) {
				ans = max(ans, j + dp[curr][j] - newZero);
			}
		}
		swap(curr, prev);
	}

	cout << ans << endl;

	return 0;
}

 